.NET 中的 gRPC 客户端工厂集成

您所在的位置:网站首页 grpc 客户端 .NET 中的 gRPC 客户端工厂集成

.NET 中的 gRPC 客户端工厂集成

2024-07-16 06:48:32| 来源: 网络整理| 查看: 265

.NET 中的 gRPC 客户端工厂集成 项目 05/31/2023

作者:James Newton-King

gRPC 与 HttpClientFactory 的集成提供了一种创建 gRPC 客户端的集中方式。 它可用作配置独立 gRPC 客户端实例的替代方法。 Grpc.Net.ClientFactory NuGet 包中提供了工厂集成。

工厂具有以下优势:

提供了用于配置逻辑 gRPC 客户端实例的中心位置。 可管理基础 HttpClientMessageHandler 的生存期。 在 ASP.NET Core gRPC 服务中自动传播截止时间和取消。 注册 gRPC 客户端

若要注册 gRPC 客户端,可在 Program.cs 中的应用入口点处的 WebApplicationBuilder 的实例中使用通用的 AddGrpcClient 扩展方法,并指定 gRPC 类型化客户端类和服务地址:

builder.Services.AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); });

gRPC 客户端类型通过依赖项注入 (DI) 注册为暂时性。 现在可以在由 DI 创建的类型中直接注入和使用客户端。 ASP.NET Core MVC 控制器、SignalR 中心和 gRPC 服务是可以自动注入 gRPC 客户端的位置:

public class AggregatorService : Aggregator.AggregatorBase { private readonly Greeter.GreeterClient _client; public AggregatorService(Greeter.GreeterClient client) { _client = client; } public override async Task SayHellos(HelloRequest request, IServerStreamWriter responseStream, ServerCallContext context) { // Forward the call on to the greeter service using (var call = _client.SayHellos(request)) { await foreach (var response in call.ResponseStream.ReadAllAsync()) { await responseStream.WriteAsync(response); } } } } 配置 HttpHandler

HttpClientFactory 创建 gRPC 客户端使用的 HttpMessageHandler。 标准 HttpClientFactory 方法可用于添加传出请求中间件或配置 HttpClient 的基础 HttpClientHandler:

builder.Services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .ConfigurePrimaryHttpMessageHandler(() => { var handler = new HttpClientHandler(); handler.ClientCertificates.Add(LoadCertificate()); return handler; });

有关详细信息,请参阅使用 IHttpClientFactory 发出 HTTP 请求。

配置侦听器

可以使用 AddInterceptor 方法将 gRPC 侦听器添加到客户端。

builder.Services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .AddInterceptor();

前面的代码:

注册 GreeterClient 类型。 为此客户端配置 LoggingInterceptor。 LoggingInterceptor 创建一次,并在 GreeterClient 实例之间共享。

默认情况下,侦听器创建一次并在客户端之间共享。 可以通过在注册侦听器时指定一个作用域来替代此行为。 可以通过指定 InterceptorScope.Client,将客户端工厂配置为给每个客户端创建一个新的侦听器。

builder.Services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .AddInterceptor(InterceptorScope.Client);

当侦听器需要来自 DI 的作用域服务或暂时性作用域服务时,创建客户端作用域内的侦听器非常有用。

gRPC 侦听器或通道凭据可用于随每个请求发送 Authorization 元数据。 有关配置身份验证的详细信息,请参阅发送具有 gRPC 客户端工厂的持有者令牌。

配置通道

可以使用 ConfigureChannel 方法将其他配置应用于通道:

builder.Services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .ConfigureChannel(o => { o.Credentials = new CustomCredentials(); });

ConfigureChannel 被传递了 GrpcChannelOptions 实例。 有关详细信息,请参阅配置客户端选项。

注意

在运行 ConfigureChannel 回调之前,在 GrpcChannelOptions 上设置了一些属性:

HttpHandler 设置为 ConfigurePrimaryHttpMessageHandler 的结果。 LoggerFactory 设置为从 DI 解析的 ILoggerFactory。

这些值可以通过 ConfigureChannel 替代。

调用凭据

可以使用 AddCallCredentials 方法将身份验证标头添加到 gRPC 调用:

builder.Services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .AddCallCredentials((context, metadata) => { if (!string.IsNullOrEmpty(_token)) { metadata.Add("Authorization", $"Bearer {_token}"); } return Task.CompletedTask; });

有关配置调用凭据的详细信息,请参阅具有 gRPC 客户端工厂的持有者令牌。

截止时间和取消传播

可以使用 EnableCallContextPropagation() 对 gRPC 服务中工厂所创建的 gRPC 客户端进行配置,以自动将截止时间和取消令牌传播到子调用。 Grpc.AspNetCore.Server.ClientFactory NuGet 包中提供了 EnableCallContextPropagation() 扩展方法。

调用上下文传播的工作方式是:从当前 gRPC 请求上下文中读取截止时间和取消令牌,并自动将其传播到 gRPC 客户端所发出的传出调用。 调用上下文传播是确保复杂的嵌套 gRPC 场景始终传播截止时间和取消的一种极佳方式。

builder.Services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .EnableCallContextPropagation();

默认情况下,如果客户端在 gRPC 调用的上下文之外使用,EnableCallContextPropagation 将引发错误。 此错误旨在提醒你没有要传播的调用上下文。 如果要在调用上下文之外使用客户端,请使用 SuppressContextNotFoundErrors 在配置客户端时禁止显示该错误:

builder.Services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .EnableCallContextPropagation(o => o.SuppressContextNotFoundErrors = true);

有关截止时间和 RPC 取消的详细信息,请参阅具有截止时间和取消功能的可靠的 gRPC 服务。

命名客户端

通常情况下,gRPC 客户端类型被注册一次,然后通过 DI 直接注入到类型的构造函数。 但在某些情况下,为一个客户端提供多个配置是很有用的。 例如,一个客户端在进行身份验证和不进行身份验证的情况下进行 gRPC 调用。

可以通过为每个客户端提供一个名称来注册同一类型的多个客户端。 每个命名的客户端可以有自己的配置。 泛型 AddGrpcClient 扩展方法具有一个包含名称参数的重载:

builder.Services .AddGrpcClient("Greeter", o => { o.Address = new Uri("https://localhost:5001"); }); builder.Services .AddGrpcClient("GreeterAuthenticated", o => { o.Address = new Uri("https://localhost:5001"); }) .ConfigureChannel(o => { o.Credentials = new CustomCredentials(); });

上述代码:

注册 GreeterClient 类型两次,每次注册指定一个唯一的名称。 为每个命名的客户端配置不同的设置。 GreeterAuthenticated 注册向通道添加了凭据,这样用它进行的 gRPC 调用就经过了身份验证。

使用 GrpcClientFactory 在应用代码中创建一个命名的 gRPC 客户端。 所需客户端的类型和名称是使用泛型 GrpcClientFactory.CreateClient 方法指定的:

public class AggregatorService : Aggregator.AggregatorBase { private readonly Greeter.GreeterClient _client; public AggregatorService(GrpcClientFactory grpcClientFactory) { _client = grpcClientFactory.CreateClient("GreeterAuthenticated"); } } 其他资源 使用 .NET 客户端调用 gRPC 服务 具有截止时间和取消功能的可靠的 gRPC 服务 在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求

gRPC 与 HttpClientFactory 的集成提供了一种创建 gRPC 客户端的集中方式。 它可用作配置独立 gRPC 客户端实例的替代方法。 Grpc.Net.ClientFactory NuGet 包中提供了工厂集成。

工厂具有以下优势:

提供了用于配置逻辑 gRPC 客户端实例的中心位置 可管理基础 HttpClientMessageHandler 的生存期 在 ASP.NET Core gRPC 服务中自动传播截止时间和取消 注册 gRPC 客户端

若要注册 gRPC 客户端,可在 Startup.ConfigureServices 中使用通用的 AddGrpcClient 扩展方法,并指定 gRPC 类型化客户端类和服务地址:

services.AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); });

gRPC 客户端类型通过依赖项注入 (DI) 注册为暂时性。 现在可以在由 DI 创建的类型中直接注入和使用客户端。 ASP.NET Core MVC 控制器、SignalR 中心和 gRPC 服务是可以自动注入 gRPC 客户端的位置:

public class AggregatorService : Aggregator.AggregatorBase { private readonly Greeter.GreeterClient _client; public AggregatorService(Greeter.GreeterClient client) { _client = client; } public override async Task SayHellos(HelloRequest request, IServerStreamWriter responseStream, ServerCallContext context) { // Forward the call on to the greeter service using (var call = _client.SayHellos(request)) { await foreach (var response in call.ResponseStream.ReadAllAsync()) { await responseStream.WriteAsync(response); } } } } 配置 HttpHandler

HttpClientFactory 创建 gRPC 客户端使用的 HttpMessageHandler。 标准 HttpClientFactory 方法可用于添加传出请求中间件或配置 HttpClient 的基础 HttpClientHandler:

services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .ConfigurePrimaryHttpMessageHandler(() => { var handler = new HttpClientHandler(); handler.ClientCertificates.Add(LoadCertificate()); return handler; });

有关详细信息,请参阅使用 IHttpClientFactory 发出 HTTP 请求。

配置侦听器

可以使用 AddInterceptor 方法将 gRPC 侦听器添加到客户端。

services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .AddInterceptor();

前面的代码:

注册 GreeterClient 类型。 为此客户端配置 LoggingInterceptor。 LoggingInterceptor 创建一次,并在 GreeterClient 实例之间共享。

默认情况下,侦听器创建一次并在客户端之间共享。 可以通过在注册侦听器时指定一个作用域来替代此行为。 可以通过指定 InterceptorScope.Client,将客户端工厂配置为给每个客户端创建一个新的侦听器。

services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .AddInterceptor(InterceptorScope.Client);

当侦听器需要来自 DI 的作用域服务或暂时性作用域服务时,创建客户端作用域内的侦听器非常有用。

gRPC 侦听器或通道凭据可用于随每个请求发送 Authorization 元数据。 有关配置身份验证的详细信息,请参阅发送具有 gRPC 客户端工厂的持有者令牌。

配置通道

可以使用 ConfigureChannel 方法将其他配置应用于通道:

services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .ConfigureChannel(o => { o.Credentials = new CustomCredentials(); });

ConfigureChannel 被传递了 GrpcChannelOptions 实例。 有关详细信息,请参阅配置客户端选项。

注意

在运行 ConfigureChannel 回调之前,在 GrpcChannelOptions 上设置了一些属性:

HttpHandler 设置为 ConfigurePrimaryHttpMessageHandler 的结果。 LoggerFactory 设置为从 DI 解析的 ILoggerFactory。

这些值可以通过 ConfigureChannel 替代。

截止时间和取消传播

可以使用 EnableCallContextPropagation() 对 gRPC 服务中工厂所创建的 gRPC 客户端进行配置,以自动将截止时间和取消令牌传播到子调用。 Grpc.AspNetCore.Server.ClientFactory NuGet 包中提供了 EnableCallContextPropagation() 扩展方法。

调用上下文传播的工作方式是:从当前 gRPC 请求上下文中读取截止时间和取消令牌,并自动将其传播到 gRPC 客户端所发出的传出调用。 调用上下文传播是确保复杂的嵌套 gRPC 场景始终传播截止时间和取消的一种极佳方式。

services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .EnableCallContextPropagation();

默认情况下,如果客户端在 gRPC 调用的上下文之外使用,EnableCallContextPropagation 将引发错误。 此错误旨在提醒你没有要传播的调用上下文。 如果要在调用上下文之外使用客户端,请使用 SuppressContextNotFoundErrors 在配置客户端时禁止显示该错误:

services .AddGrpcClient(o => { o.Address = new Uri("https://localhost:5001"); }) .EnableCallContextPropagation(o => o.SuppressContextNotFoundErrors = true);

有关截止时间和 RPC 取消的详细信息,请参阅具有截止时间和取消功能的可靠的 gRPC 服务。

命名客户端

通常情况下,gRPC 客户端类型被注册一次,然后通过 DI 直接注入到类型的构造函数。 但在某些情况下,为一个客户端提供多个配置是很有用的。 例如,一个客户端在进行身份验证和不进行身份验证的情况下进行 gRPC 调用。

可以通过为每个客户端提供一个名称来注册同一类型的多个客户端。 每个命名的客户端可以有自己的配置。 泛型 AddGrpcClient 扩展方法具有一个包含名称参数的重载:

services .AddGrpcClient("Greeter", o => { o.Address = new Uri("https://localhost:5001"); }); services .AddGrpcClient("GreeterAuthenticated", o => { o.Address = new Uri("https://localhost:5001"); }) .ConfigureChannel(o => { o.Credentials = new CustomCredentials(); });

上述代码:

注册 GreeterClient 类型两次,每次注册指定一个唯一的名称。 为每个命名的客户端配置不同的设置。 GreeterAuthenticated 注册向通道添加了凭据,这样用它进行的 gRPC 调用就经过了身份验证。

使用 GrpcClientFactory 在应用代码中创建一个命名的 gRPC 客户端。 所需客户端的类型和名称是使用泛型 GrpcClientFactory.CreateClient 方法指定的:

public class AggregatorService : Aggregator.AggregatorBase { private readonly Greeter.GreeterClient _client; public AggregatorService(GrpcClientFactory grpcClientFactory) { _client = grpcClientFactory.CreateClient("GreeterAuthenticated"); } } 其他资源 使用 .NET 客户端调用 gRPC 服务 具有截止时间和取消功能的可靠的 gRPC 服务 在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭